GSP-024 Build a Slack Bot with Node.js on
Kubernetes
2017년 11월 3일 금요일
오전 8:52
링크: https://google.qwiklabs.com/focuses/6023
1) Botkit toolkit 으로 https://api.slack.com/bot-users
2) Slack bot을
만들자 https://botkit.ai/
3) 만든걸 GCP 에서 돌려보자
이제 Slack channel 에서 인터렉티브하게 돌릴 수 있을거다
- 슬랙에서 봇을 커스텀하게
생성
- docker에서 Node.js 이미지를 build
- Docker image를 Google Container Registry (=private 하다) 에
넣어둔다
- 슬랙봇을 GCK (Google Container Engine)에 올리자. GKE = managed
Kubernetes service
: https://slack.com/create#email
참여한, 봇을 실험할 수 있는 슬랙팀에 가입되어 있어야겠죠?
아니면 하나
만들어버리구요.
깃헙에서 가져오면
된다.
- package.json 이 포함된 프로젝트가 있을때에 (node.js, angular 등등) - npm install 을 실행하면 - package.json 에 설정된 종속 라이브러리
(=dependencies) 를 다운받고 설치해준다 |
|
링크: https://api.slack.com/bot-users
bot user는
- slack 의 메시지를
들을 수 있고,
- 메시지를 post 할 수 있고,
- 파일을 upload 할 수 있다.
간단히 인사를
하는 슬랙봇을 만들어보자.
앱을 새로
만들자 https://api.slack.com/apps
1) kittenbot 이라고
만들고
2) 봇을 적용할 slack team을 선택하자
1) app configuration page 에서 Bot user를 선택하고
2) Add a bot user 를 클릭
3) @kittenbot 이라고
이름지어주고
4) Always show toe bot as online 을 끌 것
- Realtime Messaging API (RTM) 을 쓸거라서 그럼
- bot user는 bot 으로부터 연결이 있을때만 online 이 될 거다.
5) Add bot user 클릭
1) app configuration page의 OAuth & Permissions 선택
- 아래 추가해줘야 한다
- 그러고 나면 install 항목이 enable 되고, 진행하면 된다
2) Reinstall app 클릭
- app을 team에
reinstall 해주고
- bot user를 team에 추가해준다
3) Bot user OAuth access token을 복사해둔다
- 요거 보안에 주의해주세요
- git에 넣어두거나
누구 보여주면 안됨
1) kittenbot.js 파일에
복사해둔 Slack bot token을 넣어준다.
- 코드에서 your-slack-token 이라는 데를 찾아서 넣어준다
2) node kittenbot.js
3) slack 에서 direct messages 에서 볼 수 있을것이다. 안보이면 찾아내면
된다
- hello 하고 인사해보자
ㅎㅎ
코드에 token을 넣어둔채로 docker image를 만들 순 없잖아?
- Kubernetes Secrets 를 쓰면 된다
- 링크( TR;DR): https://kubernetes.io/docs/concepts/configuration/secret/
1. slack-token 이라는
파일을 만들자
- .gitignore에
이미 들어있어서 git 을 통해 올라가지도 않는다.
2. kittenbot.js 파일
수정
|
1. slack_token_path 존재 여부 확인 - 파일을 읽는다 2. token 값을 읽어온걸 정규식으로 다듬는다 /\s/g, '' 에서 \s 는 스페이스, 등등의 공백 /g 는 글로벌하게
찾아서 '' 로 바꿔라 = 없애버려라 3. 문답을 하나 더 추가해보았음 |
3. slack-token 파일에
kittenbot.js 에 넣어둔 토큰을 복사해 넣는다. 그리고
실행
|
1. node 5.4 버전 이미지를 base로
해서 이미지를 만든다 2. 현재 폴더의
package.json 파일을 base 도커이미지의
/src/package.json 으로 복사 3. WORKDIR 환경변수는 /src 로
설정 4. RUN npm install 하면 - base 도커이미지에
- package.json 에 명시된대로 dependencies 가 설치됨 5. kittenbot.js 파일을 /src 폴더로
복사 5. 실행명령 node 로 /src/kittenbot.js 실행 |
빌드는 그냥 PROJECT_ID를 넣어도 되는데 범용성을 위해 아래와 같이 하는 것 같다
|
|
|
|
도커 빌드되는
동안 다른걸 쫌 더 해볼까?
incoming webhook: https://api.slack.com/incoming-webhooks
- 데이터를 실시간으로 Slack 에게 보내기?
- 이 경우 bot user 처럼 양방향 (two-way) 연결 유지를 고민할
필요 없음
Slack Custom Intergrations
management console로
간다 - https://my.slack.com/apps/manage/custom-integrations - Incoming Webhooks >> Add configuration 버튼 클릭 - 메시지를 포스트하고
싶은 Slack Channel 선택 - Add incoming webhooks integration 버튼 클릭 |
Incoming Webhooks 가 왼쪽 가이드대로 해도 안나오길래 상단 검색
|
일단 내 컴터에서
도커로 돌려보기
빌드는 되었다
(원래명령)
(실행)
- 윈도우라 pwd 명령이 없음.
- 그냥 e:\git\cloud-slack-bot\start 라고 명시해준 부분 참고
- "-v" 옵션은 도커가 아닌 실제 컴퓨터의 이 부분을 사용하겠다는 이야기임. slack-token 파일에
접근하기 위해서 여기서는 이렇게 사용함
로컬의 docker image를 구글의 Registry에 넣어보자
- 전에 해보니, 아까 build 할때에
project id를 제대로 안적었다면 push 되지 않았었다
Google Container Registry로 push 하는 동안 웹훅 다시보기
- push 되는 중으로
가정하고 cloud shell의 session을 하나 더
연다
- 나는 그냥 로컬 컴터니깐 cmd 창 하나 새로 열면 됨
아까 웹훅
만들었을때 URL을 보자
curl 을 이용해서 HTTP request 를 보내보자
* 잔디 커넥트의 인커밍
웹훅도 재미날듯 하다
bot 이 잘 동작하는지
모니터링 해줄 녀석이 필요하다.
- 도커가 멈춰도 restart 해주고
- 심지어는, 컴터가 뻑이나도 다른 컴터에서 돌려줄 녀석
= Kubernetes
- 구글에서 제공하는 managed Kubernetes cluster
- Contaner Engine Cluster 는 둘로 이루어져 있다.
1) Kubernetes master API server (hosted by Google)
2) a set of worker nodes (= Compute Engine VMs)
|
1) container cluster를 만들어라. 이름은
my-cluster 2) 노드 = VM = 2개 3) 지역은
us-central1-f 4) 컴터 종류는
n1-standard-1 |
만들어는 주는데, 이후 Container Engine Cluster에 접근하려면 kubectl 이 필요하다고 알려줌
웹콘솔로 노드 = VM 생성 확인
CLI로도 확인이 가능하다
먼저 Slack Token을 저장하기 위해 Kubernetes에 Secret 이란걸 만들자
- 링크: https://goo.gl/321yg4
Deploy 를 어떻게
할지를 명시한 yaml 파일 만들기
드디어 실제로 Deployment
"-f" 는
파일명
"--record"는 대략 kubectl 명령기록 저장인가?
Running 확인
- 이제 슬랙에서 kittenbot 동작될거다
매끄럽게 버전업
하는건 우리의 로망이다.
1) kittenbot.js 파일을
변경한다
2) docker build 하여 image를 생성하고
3) gcloud docker -- push 하여 GCP의 registry에
넣는다
4) yaml 파일을 변경한다
- 사용할 docker image만 바꿔주면 된다
5) 적용은 kubectl apply -f slack-codelab-deployment.yaml
- 아래는 실시간으로 기존의 image가 돌아가던 pod 이 종료되고
- 새로운 pod이 돌아가는 상황이다
Microsoft OneNote 2016에서 작성